/*数字高程模型*/
#pragma once
#include "tools/Types.h"
#include "tools/OmpHelper.h"



class DEM
{


private:

    Eigen::Vector2d Origin_coor_;//初始2维坐标
    Scalar resolution_;//网格分辨率
    Scalar wight_; //DEM实际的宽度
    Scalar height_;//DEM实际的高度

    std::map<std::pair<int,int>,Scalar>          Map_elvation;
    std::map<std::pair<int,int>,Eigen::Vector3d> Map_color;
    std::map<std::pair<int,int>,Scalar>          Map_weight;
    std::map<std::pair<int,int>,Scalar>          Map_grad;//梯度
   
    // PointCloud   Pc_DEM_;//高程数字地图完全点云
    Scalar radius_;//形变点采样半径
    PointCloud   Pc_warp_;//表达形变的点云 



private:

    void Grad_cal(std::map<std::pair<int,int>,Scalar> map);


public:


    DEM();
    ~DEM();

    void DEM_generate(std::shared_ptr<open3d::geometry::PointCloud> pc,Scalar gridsize);               //mainDEM表示该DEM是否需要不断维护
    void ExtractWarppc(Scalar radius);                              //提取形变点，VIP表示是否进行VIP初始采样,ratio表示vip采样比例
    void Merge(MatrixXX Smat_X,DEM* dem);                           //通过位移场进行更新并融合    
    void Merge_GPU(Scalar *deformpositon,DEM* dem, int n_allp);         
    void Coffset_GPU(double* &f,int f_ld,double* &ew, int ew_ld,double* &m, int m_ld,VPairs corrs,Scalar searchratio,double* &x_);//ld代表对应矩阵的列数
    open3d::geometry::TriangleMesh Generate_mesh();                 //从点云中生成mesh
    PointCloud Generate_pc();                                       //根据输入的矩阵生成对应点云

    PointCloud Getwarppc();
    Eigen::Vector2d GetOc();
    std::map<std::pair<int,int>,Scalar> GetMap_e();
    std::map<std::pair<int,int>,Eigen::Vector3d> GetMap_c();

};